home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat31 / iobject / sources.lha / sources / Button.c next >
Encoding:
C/C++ Source or Header  |  1993-03-23  |  4.2 KB  |  195 lines

  1.  // Gestionnaire de boutons V0.22
  2. // (C) 1992 Christophe PASSUELLO
  3. // Sat Feb 20 15:24:24 1993
  4.  
  5.  
  6. #include <exec/types.h>
  7. #include <exec/memory.h>
  8. #include "mytypes.h"
  9. #define  INTUITION_PREFERENCES_H 0
  10. #include <intuition/intuition.h>
  11. #include "IObject_priv.h"
  12.  
  13.  
  14. struct Button
  15. {
  16.     struct ObjectTMV *TMV;
  17.     UWORD  ObjectID;
  18.     UWORD  Flags;
  19.     STRPTR LabelText;
  20.     struct TextFont *Font;
  21.     struct Window *window;
  22.     struct Requester *requester;
  23.     UWORD  ClassFlags;
  24.     struct Box BorderBox;
  25.     struct Gadget Gadget;
  26. };
  27.  
  28.  
  29. // prototypes pour les methodes
  30. PRIVATE BOOL ButtonMsg(struct Button *, struct IntuiMessage *);
  31. VOID ModifyButton(struct Button *, BOOL);
  32. PRIVATE VOID DisplayButton(struct Button *);
  33. PRIVATE VOID EraseButton(struct Button *);
  34. PRIVATE BOOL ButtonValue(struct Button *);
  35. PRIVATE VOID OnButton(struct Button *);
  36. PRIVATE VOID ActivateButton(struct Button *);
  37.  
  38.  
  39. // Methodes pour les Buttons
  40. const static struct ObjectTMV ButtonMethod=
  41. {
  42.     CLASS_BUTTON, sizeof(struct Button),
  43.     DisposeObject, ButtonMsg, AddObject, RemoveObject, DisplayButton, EraseButton,
  44.     ModifyButton, ButtonValue, OffObjectGad, OnButton, ActivateButton
  45. };
  46.  
  47.  
  48. //
  49. // Alloue et Initialise le Button
  50. //
  51. struct Button *CreateButton(struct NewButton *nb, UWORD ID)
  52. {
  53.     struct Button *but;
  54.  
  55.     if (but = (struct Button *) AllocMem(sizeof(struct Button), MEMF_PUBLIC|MEMF_CLEAR))
  56.     {
  57.         // Initialise la TMV
  58.         but->TMV = &ButtonMethod;
  59.         but->ObjectID = ID;
  60.  
  61.         // recupere les champs de NewButton
  62.         InitObjectGad( (struct ObjectGad *) but, (struct NewObject *) nb);
  63.         but->Gadget.GadgetType = BOOLGADGET;
  64.         but->Gadget.Flags = GADGHCOMP;
  65.  
  66.         if (but->ClassFlags & BT_TOGGLE)
  67.         {
  68.             but->Gadget.Activation = GADGIMMEDIATE|TOGGLESELECT;
  69.             if (but->ClassFlags & BT_SELECTED)
  70.                 but->Gadget.Flags |= SELECTED;
  71.         }
  72.         else
  73.             but->Gadget.Activation = RELVERIFY;
  74.  
  75.         // Centre l'image dans le bouton
  76.         if (but->ClassFlags & BT_IMAGELABEL)
  77.         {
  78.             struct Image *img;
  79.  
  80.             img = (struct Image *) but->LabelText;
  81.             img->LeftEdge = but->BorderBox.x + (but->BorderBox.w - img->Width) / 2;
  82.             img->TopEdge = but->BorderBox.y + (but->BorderBox.h - img->Height) / 2;
  83.         }
  84.     }
  85.     return (but);
  86. }
  87.  
  88.  
  89. //
  90. // Renvoie l'etat du bouton
  91. //
  92. PRIVATE BOOL ButtonValue(struct Button *but)
  93. {
  94.     return (but->Gadget.Flags & SELECTED ? TRUE : FALSE);
  95. }
  96.  
  97.  
  98. //
  99. // Modifie le bouton
  100. //
  101. PRIVATE VOID ModifyButton(struct Button *but, BOOL select)
  102. {
  103.     if (but->ClassFlags & BT_TOGGLE)
  104.     {
  105.         if ((!select && (but->ClassFlags & BT_SELECTED)) ||    (select && !(but->ClassFlags & BT_SELECTED)))
  106.         {
  107.             but->ClassFlags ^= BT_SELECTED;
  108.             but->Gadget.Flags ^= SELECTED;
  109.             if (!(but->Flags & OBJ_DISABLED))
  110.                 ComplementBox(&but->BorderBox, but->window->RPort);
  111.         }
  112.     }
  113. }
  114.  
  115.  
  116. //
  117. // Active un bouton
  118. //
  119. PRIVATE VOID ActivateButton(struct Button *but)
  120. {
  121.     if (but->ClassFlags & BT_TOGGLE)
  122.         ModifyButton(but, (but->ClassFlags & BT_SELECTED) ? FALSE : TRUE);
  123.     else
  124.     {
  125.         ComplementBox(&but->BorderBox, but->window->RPort);
  126.         Delay(5);
  127.         ComplementBox(&but->BorderBox, but->window->RPort);
  128.     }
  129. }
  130.  
  131.  
  132. //
  133. // gestion de l'IntuiMessage pour le bouton
  134. //
  135. PRIVATE BOOL ButtonMsg(struct Button *but, struct IntuiMessage *msg)
  136. {
  137.     return (TRUE);
  138. }
  139.  
  140.  
  141. //
  142. // Efface le Button
  143. //
  144. PRIVATE VOID EraseButton(struct Button *but)
  145. {
  146.     if (but->ClassFlags & BT_IMAGELABEL)
  147.         EraseBox( &but->BorderBox, but->window->RPort);
  148.     else
  149.         EraseObjectFrame( (struct Object *) but, &but->BorderBox);
  150. }
  151.  
  152.  
  153. //
  154. // Affiche le Button
  155. //
  156. PRIVATE VOID DisplayButton(struct Button *but)
  157. {
  158.     struct RastPort *rp;
  159.     struct TextEnv env;
  160.  
  161.     if (but->window)
  162.     {
  163.         rp = but->window->RPort;
  164.         SaveTextEnv(but->window->RPort, &env);
  165.         if (but->ClassFlags & BT_IMAGELABEL)
  166.             DrawImage(rp, (struct Image *) but->LabelText, 0L , 0L);
  167.         else
  168.             PrintObjectLabel( (struct Object *) but, (struct Box *) &but->BorderBox);
  169.  
  170.         FastDraw3DBox( (struct Box *) &but->BorderBox, rp, BOX_1OUT);
  171.         RestoreTextEnv(rp, &env);
  172.  
  173.         if (but->ClassFlags & (BT_SELECTED))
  174.             ComplementBox(&but->BorderBox, rp);
  175.  
  176.         if (but->Flags & OBJ_DISABLED)
  177.             OffObjectGad((struct ObjectGad *) but);
  178.     }
  179. }
  180.  
  181.  
  182. //
  183. // Ghoste un bouton
  184. //
  185. PRIVATE VOID OnButton(struct Button *but)
  186. {
  187.     if (but->Flags & OBJ_DISABLED)
  188.     {
  189.         but->Flags &= (~OBJ_DISABLED);
  190.         OnGadget(&but->Gadget, but->window, but->requester);
  191.         EraseBox( (struct Box *) &but->Gadget.LeftEdge, but->window->RPort);
  192.         DisplayButton(but);
  193.     }
  194. }
  195.